#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# @File  : doubanmovie.py
# @Author: longgege
# @Date  : 2020/6/12
# @Desc  : PyCharm
import requests
from lxml import html
# 被爬取网站的消息头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}


# 爬取页面内容
def moviesInfo(url):
    # 根据url和headers获取网站全部内容
    reponse = requests.get(url=url, headers=headers).content
    # 通过html模块解析上面获取的内容
    bs = html.fromstring(reponse)
    num = 0
    # print("+++++++++++++++++++++", bs.xpath('//div[@class ="info"]'))

    # 通过xpath获取"div[@class ="info"]"的所有节点，即豆瓣的所有电影信息，每一个电影信息为一个"div[@class ="info"]"，因此这里循环获取具体信息
    for i in bs.xpath('//div[@class ="info"]'):
        try:
            # 序列
            # print("==========num:",num)

            # 因为这个序列是在"div[@class ="info"]"外面（即bs里面），所以这边是用的bs.xpath，而不是i.xpath
            movieNo = bs.xpath('//*[@id="content"]/div/div[1]/ol/li[{}]/div/div[1]/em/text()'.format(num + 1))[0]
            # movieNo = bs.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[1]/em/text()')
            # movieNo = bs.xpath('//*[@id="content"]/div/div[1]/ol/li[numa]/div/div[1]/em/text()',numa=num)
            # print("==========numa:",numa)

            # 电影名称
            movieName = i.xpath('div[@class="hd"]/a/span[@class="title"]/text()')[0]
            # 评星
            mobieStart = i.xpath('//div[@class="star"]/span[2]/text()')[num]
            # 电影信息
            movieInfo = i.xpath('div[@class="bd"]/p[1]/text()')
            # 电影简述
            movieDescribes = i.xpath('//span[@class="inq"]/text()')
            # 电影评论人数
            movieNums = i.xpath('//div[@class="star"]/span[4]/text()')

            # 上映国家
            moviePeople = movieInfo[1].replace(" ", "").replace("\n", "").split("/")[1]
            # 电影上映时间
            movieDate = movieInfo[1].replace(" ", "").replace("\n", "").split("/")[0]
            # 获取电影的每一条简述
            movieDescribe = movieDescribes[num]
            # 获取每一个电影的评论人数
            movieNum = movieNums[num]

            # 向文件中追加内容
            with open(file_name, 'a+', encoding="utf-8") as file:
                file.writelines("%s   %s   %s   %s   %s   %s   %s\n" % (
                movieNo, movieName, mobieStart, movieNum, moviePeople, movieDate, movieDescribe))

            num += 1
        except Exception as e:
            print(e)
            break


if __name__ == '__main__':
    num = 0
    file_name = '2020movies_top250.txt'
    # 新建文件，并向文件中写入首行作为标题行
    open(file_name, 'w+', encoding="utf-8").writelines("序列   电影名称   评星   评论人数   上映国家   上映时间   简述\n")
    open(file_name, 'a+', encoding="utf-8").writelines(
        "=========================================================================\n")

    # 这里rang(10)是循环10页
    for i in range(10):
        # 指定要爬虫的网页url
        page = 'https://movie.douban.com/top250?start=%d&filter=' % num
        moviesInfo(page)
        # 指定每页多少部电影，这里是每页25部电影，共10页，因此是250部电影
        num += 25